package com.lhf.springcloud.utils;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.List;

public class XmlUtils {
    /**
     * 根据类的属性名找表的列名（取一个的时候可以使用此方法）
     * @param fileName 类对应的Mapper xml文件
     * @param id  唯一的id
     * <p>
     * 如：resultMap id="BaseResultMap" type="com.chinagas.org.beans.User" 中的id
     * </p>
     * @param property 属性名（对应的Java对象属性名）
     * @return
     */
    public static String getMapperPropertyByColumn(String fileName, String id, String property){
        try {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(XmlUtils.class.getClassLoader().getResourceAsStream(fileName));
            if(document != null){
                Element root = document.getRootElement();
                if(root != null){
                    @SuppressWarnings("unchecked")
                    List<Element> resultMaps = root.elements("resultMap");
                    for (Element resultMap : resultMaps) {
                        if(resultMap != null && resultMap.attributeValue("id").equals(id)){
                            @SuppressWarnings("unchecked")
                            List<Element> properties = resultMap.elements();
                            for (Element prop : properties) {
                                if(prop != null && prop.attributeValue("column").equals(property)){
                                    return prop.attributeValue("property");
                                }
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 返回ResultMap对应Element对象（取2次以上的时候，建议先把Element对象找到，再根据此Element对象再去找column，效率高很多）
     * @param fileName 类对应的Mapper xml文件
     * @param id  唯一的id
     * <p>
     * 如：resultMap id="BaseResultMap" type="com.chinagas.org.beans.User" 中的id
     * </p>
     * @return
     */
    public static Element getResultMapElement(String fileName, String id){
        try {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(XmlUtils.class.getClassLoader().getResourceAsStream(fileName));
            if(document != null){
                Element root = document.getRootElement();
                if(root != null){
                    @SuppressWarnings("unchecked")
                    List<Element> resultMaps = root.elements("resultMap");
                    for (Element resultMap : resultMaps) {
                        if(resultMap != null && resultMap.attributeValue("id").equals(id)){
                            return resultMap;
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 在Element根据property找表的列名（和方法getResultMapElement()结合使用，多次取Column时效率高出很多倍）
     * @param resultMapElement Mapper xml文件解析后得到的Element对象（方法：getResultMapElement()）
     * @param property 属性名（对应的Java对象属性名）
     * @return
     */
    public static String getMapperColumnByElement(Element resultMapElement, String property){
        try {
            if(resultMapElement != null){
                @SuppressWarnings("unchecked")
                List<Element> properties = resultMapElement.elements();
                for (Element prop : properties) {
                    if(prop != null && prop.attributeValue("property").equals(property)){
                        return prop.attributeValue("column");
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
